package com.wzy.gmall.admin.aop;

import com.wzy.gmall.to.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;

/**
 * 切面编写注解:
 * 1.导包,spring-boot-starter-aop
 * 2.编写切面:
 * 3.切入点表达式
 * 前置通知:方法执行之前触发
 * 后置通知:方法执行之后
 * 返回通知:方法正常返回之后
 * 异常通知:方法出现异常触发
 * <p>
 * 环绕通知:4合一
 * <p>
 * 注意:环绕通知方法中的遗产,一般都需要再次跑出,否则外界无法感知,不能进入异常处理器
 */
@Aspect
@Slf4j
@Component

public class DataVaildAspect {
    @Around("execution(* com.wzy.gmall.admin..*Controller.*(..))")
    public Object validAround(ProceedingJoinPoint point) {
        Object proceed = null;
        try {
            log.debug("校验切面介入工作");
            //前置
            Object[] args = point.getArgs();
            for (Object obj : args) {
                if (obj instanceof BindingResult) {
                    BindingResult r = (BindingResult) obj;
                    int errorCount = r.getErrorCount();
                    if (errorCount > 0) {
                        //错误数大于0
                        return new CommonResult().validateFailed(r);
                    }
                }
            }
            proceed = point.proceed(args);
            //返回
            log.debug("校验切面方法已经放行{}", proceed);
        } catch (Throwable throwable) {
            //异常
            throw new RuntimeException(throwable);
        } finally {
            //后置

        }
        return proceed;

    }
}
